﻿--Проверка изменения документов в РОДНОМ подразделении

CREATE PROCEDURE [dbo].[SupplierInvoiceDocUpdate]
(--приходная накладная от поставщика
	@DocDate smalldatetime,
	@DocNumber varchar(20),
	@ContragentId int,
	@ContragentDocDate smalldatetime,
	@ContragentDocNumber varchar(20),
	@PaymentDate smalldatetime,
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@Original_Id int,
	@Original_MD datetime
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @orgDocDate smalldatetime, @orgContragentId int
DECLARE @orgDocTypeId int

	SET NOCOUNT ON

IF (@DocDate Is Null) OR (@DocNumber Is Null) OR (@ContragentId Is Null)
OR (@Original_Id Is Null) OR (@Original_MD Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @orgDocTypeId = DocTypeId, @orgDocDate = DocDate, @orgContragentId = ContragentId
FROM CA.Documents WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgDocTypeId <> 2
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Неправильный тип документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SET @DocDate = dbo.NormalizeDate(@DocDate)

IF (@ContragentDocDate Is NOT Null) SET @ContragentDocDate = dbo.NormalizeDate(@ContragentDocDate)
IF (@PaymentDate Is NOT Null) SET @PaymentDate = dbo.NormalizeDate(@PaymentDate)

IF @orgDocDate < @DocDate --новая дата больше чем старая
BEGIN
	IF EXISTS (
SELECT TOP (1) D.Id FROM CD.Parties AS P INNER JOIN CA.GoodsDocLines AS L ON P.Id = L.PartyId 
INNER JOIN CA.Documents AS D ON L.DocId = D.Id
WHERE (P.DocId = @Original_Id) AND (D.DocDate < @DocDate) AND (L.DocId <> @Original_Id) )
	BEGIN
		SELECT @intErrCode = 4, 
		@strMsg = 'По товарам из приходной накладной было движение по датам меньшим чем новая дата накладной!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END
/*Смена контрагента приходной накладной, закомментировал Евгений Веприков 10,12,2006*/
/*IF @orgContragentId <> @ContragentId
BEGIN
	IF EXISTS (
SELECT TOP (1) L.Id
FROM CA.GoodsDocLines AS L INNER JOIN CA.Documents AS D ON L.DocId = D.Id
WHERE (D.Id = @Original_Id) )
	BEGIN
		SELECT @intErrCode = 5, 
		@strMsg = 'Если существуют строки по приходной накладной, то нельзя менять поставщика!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END*/

IF (@ContragentDocDate Is NOT Null) AND @ContragentDocDate > @DocDate
BEGIN
	SELECT @intErrCode = 6, 
	@strMsg = 'Дата документа поставщика больше даты приходной накладной!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF (@PaymentDate Is NOT Null) AND @PaymentDate < @DocDate
BEGIN
	SELECT @intErrCode = 7, 
	@strMsg = 'Дата оплаты д.б. больше даты приходной накладной!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--обновление контрагента, номера и даты накладной поставщика (для возвратов в случае межскладского перемещения)
UPDATE CD.InputLines SET ContragentId = @ContragentId, ContragentDocDate = @ContragentDocDate, ContragentDocNumber = @ContragentDocNumber
WHERE DocId = @Original_Id

EXEC @intRet = dbo.CheckAllowUpdateDeleteForRecord @Original_Id
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;
UPDATE [CA].[Documents] SET 
[DocDate] = @DocDate, 
[DocNumber] = @DocNumber, 
[ContragentId] = @ContragentId, 
ContragentDocDate = @ContragentDocDate, 
ContragentDocNumber = @ContragentDocNumber, 
PaymentDate = @PaymentDate,
[Note] = @Note, [MD] = @MD, [MW] = @MW 
WHERE Id = @Original_Id AND MD = @Original_MD;
	
SELECT Id, DepartmentId, DocTypeId, DocDate, DocNumber, 
ContragentId, ContragentDocDate, ContragentDocNumber, PaymentDate,
DepartmentUserId, 
Note, MD, MW FROM CA.Documents WHERE (Id = @Original_Id)
RETURN 0


